console.log("自定义对象的迭代器")
// 默认情况下 自定义的对象是没有创建迭代器的函数的
// for of 需要依赖于迭代器

let myObject = {
    a: 10,
    b: 20,
    c: 30
}

Object.defineProperty(myObject, Symbol.iterator, {
    enumerable: false, // 建议将迭代器定义为 不可枚举的
    writable: false,
    configurable: false,

    // 一个创建迭代器的函数
    value: function () {
        let keys = Object.keys(this)
        let count =0;
        return {
            next:  ()=> {
                if(count<keys.length){
                    return {
                        value: this[keys[count++]],
                        done:false
                    }
                }
                return {
                    done:true
                }
            }
        }
    }
})


for (const val of myObject) {
    console.log(val)
}

// 手动调用对象的迭代器
// 获得迭代器
let iterator = myObject[Symbol.iterator]()

console.log(iterator.next())

console.log(iterator.next())

console.log(iterator.next())

console.log(iterator.next())

console.log(myObject.propertyIsEnumerable(Symbol.iterator))


let iterableObj = {
    x:100,
    y:200,
    z:300,

    /**
     * 直接把 创建迭代器的函数定义在对象中
     * @returns {{next: ((function(): ({value: *, done: boolean}))|*)}}
     */
    [Symbol.iterator]:function (){
        let keys = Object.keys(this)
        let count = 0;
        return {
            next:()=>{
                if(count<keys.length){
                    return {
                        value:this[keys[count++]],
                        done:false
                    }
                }
                return  {
                    done:true
                }
            }
        }
    }
}

for (let val of iterableObj) {
    console.log(val)
}
